#!/usr/bin/env bash
# 这个文件中的函数可能部分来源于dylanaraps的pure-bash-bible项目。其中一些可能已经有所修改，详细请参考其原项目（地址： https://github.com/dylanaraps/pure-bash-bible）。

# 获取文件路径或者路径的父目录
dirname()
{
    # 用法: dirname "path"
    local tmp=${1:-.}

    [[ $tmp != *[!/]* ]] && {
        printf '/\n'
        return
    }

    tmp=${tmp%%"${tmp##*[!/]}"}

    [[ $tmp != */* ]] && {
        printf '.\n'
        return
    }

    tmp=${tmp%/*}
    tmp=${tmp%%"${tmp##*[!/]}"}

    printf '%s\n' "${tmp:-/}"
}

# 获取文件名或路径的目录名
basename()
{
    # 用法: basename "path" ["后缀"]
    local tmp

    tmp=${1%"${1##*[!/]}"}
    tmp=${tmp##*/}
    tmp=${tmp%"${2/"$tmp"}"}

    printf '%s\n' "${tmp:-/}"
}

# 获取文本内容
read_file()
{
    # 用法: read_file "path"
    echo "$(<"$1")"
}

# 获取文件的前n行
read_file_head() {
    # 用法：read_file_head "n" "file"
    mapfile -tn "$1" line < "$2"
    printf '%s\n' "${line[@]}"
}

# 获取文件的后n行
read_file_tail() {
    # 用法：read_file_tail "n" "file"
    mapfile -tn 0 line < "$2"
    printf '%s\n' "${line[@]: -$1}"
}

# 获取文本的行数
read_file_lines() {
    # 用法：read_file_lines "file"
    mapfile -tn 0 lines < "$1"
    printf '%s\n' "${#lines[@]}"
}

# 计算目录中的文件或目录
fd_count() {
    # 用法：fd_count /path/to/dir/*
    #        fd_count /path/to/dir/*/
    printf '%s\n' "$#"
}

# 创建一个空文件
empty_file() {
    # 用法：empty_file /path/file
    echo -n "" > $1
}

# 提取两个标记之间的行
extract() {
    # 用法: extract file "opening marker" "closing marker"
    while IFS=$'\n' read -r line; do
        [[ $extract && $line != "$3" ]] &&
            printf '%s\n' "$line"

        [[ $line == "$2" ]] && extract=1
        [[ $line == "$3" ]] && extract=
    done < "$1"
}

# 遍历文件夹及其子目录
travel_dir() {
    # 用法: travel_dir path
    shopt -s globstar
    for file in $1/**/*; do
        printf '%s\n' "$file"
    done
    shopt -u globstar
}
